import keras


# # 5.2 - 使用小数据集来训练卷积神经网络

# 猫狗图片识别任务
# ２０００猫，２０００狗
# 训练集：2000条
# 验证集：1000条
# 测试集:1000条

# 这个部分，我们使用少量数据来处理这个难题：
# 首先用２０００的数据集训练一个ｃｏｎｖｎｅｔ
# 我们不使用任何正则化，以此来设置一个ｂａｓｅｌｉｎｅ
 
# 注意，欠拟合我们看训练集的预测
# 过拟合我们看对验证集的预测。 
# 然后我们会引入数据增强技术来减缓过拟合问题。

# 下面这句话不太好翻译，保留原文：
# By leveraging data augmentation, we will improve 
# our network to reach an accuracy of 82%.


# 训练一个小网络
# 对预训练的网络进行特征提取，
# 对预训练的网络进行微调
# 将会称为你未来处理小型数据集的重要工具

# 卷积神经网络学到的是局部的、平移不变的特性，他们对感知问题十分有效

# 图片是JPEG格式，他们像这样：
# https://s3.amazonaws.com/book.keras.io/img/ch5/cats_vs_dogs_samples.jpg

# 对于图片分类任务，我们使用１０%的数据集也会达到使用１００％的数据集的类似的效果

# 我们使用其中一部分数据集：
# 猫训练集:1000
# 猫验证集：500
# 猫测试集：500

# 狗训练集:1000
# 狗验证集：500
# 狗测试集：500


#---------------------------代码清单5-4--------------------------------------
import os, shutil


original_dataset_dir = './kaggle_original_data/train'

#存放小数据集的路径
base_dir = './fchollet/cats_and_dogs_small'
os.mkdir(base_dir)

# 下面是各种路径名字的拼接
train_dir = os.path.join(base_dir, 'train')
os.mkdir(train_dir)#新建文件夹
validation_dir = os.path.join(base_dir, 'validation')
os.mkdir(validation_dir)
test_dir = os.path.join(base_dir, 'test')
os.mkdir(test_dir)

# 存放猫的训练集
train_cats_dir = os.path.join(train_dir, 'cats')
os.mkdir(train_cats_dir)

# 存放狗的训练集
train_dogs_dir = os.path.join(train_dir, 'dogs')
os.mkdir(train_dogs_dir)

# 存放猫的验证集
validation_cats_dir = os.path.join(validation_dir, 'cats')
os.mkdir(validation_cats_dir)

# 存放狗的验证集
validation_dogs_dir = os.path.join(validation_dir, 'dogs')
os.mkdir(validation_dogs_dir)

#存放猫的测试集
test_cats_dir = os.path.join(test_dir, 'cats')
os.mkdir(test_cats_dir)

#存放狗的测试集
test_dogs_dir = os.path.join(test_dir, 'dogs')
os.mkdir(test_dogs_dir)

# 把前面１０００张猫图片拷贝到训练集目录下面
fnames = ['cat.{}.jpg'.format(i) for i in range(1000)]
for fname in fnames:
    src = os.path.join(original_dataset_dir, fname)
    dst = os.path.join(train_cats_dir, fname)
    shutil.copyfile(src, dst)

#把接下来的５００张猫的图片拷贝到验证集下面
fnames = ['cat.{}.jpg'.format(i) for i in range(1000, 1500)]
for fname in fnames:
    src = os.path.join(original_dataset_dir, fname)
    dst = os.path.join(validation_cats_dir, fname)
    shutil.copyfile(src, dst)
    
#把接下来的５００张猫的图片拷贝到测试集下面
fnames = ['cat.{}.jpg'.format(i) for i in range(1500, 2000)]
for fname in fnames:
    src = os.path.join(original_dataset_dir, fname)
    dst = os.path.join(test_cats_dir, fname)
    shutil.copyfile(src, dst)
    
# 把前面１０００张狗图片拷贝到训练集目录下面
fnames = ['dog.{}.jpg'.format(i) for i in range(1000)]
for fname in fnames:
    src = os.path.join(original_dataset_dir, fname)
    dst = os.path.join(train_dogs_dir, fname)
    shutil.copyfile(src, dst)
    
# 把前面５００张狗图片拷贝到验证集目录下面
fnames = ['dog.{}.jpg'.format(i) for i in range(1000, 1500)]
for fname in fnames:
    src = os.path.join(original_dataset_dir, fname)
    dst = os.path.join(validation_dogs_dir, fname)
    shutil.copyfile(src, dst)
    
# Copy next 500 dog images to test_dogs_dir
fnames = ['dog.{}.jpg'.format(i) for i in range(1500, 2000)]
for fname in fnames:
    src = os.path.join(original_dataset_dir, fname)
    dst = os.path.join(test_dogs_dir, fname)
    shutil.copyfile(src, dst)


# As a sanity check, let's count how many pictures we have in each training split (train/validation/test):
print('total training cat images:', len(os.listdir(train_cats_dir)))
print('total training dog images:', len(os.listdir(train_dogs_dir)))
print('total validation cat images:', len(os.listdir(validation_cats_dir)))
print('total validation dog images:', len(os.listdir(validation_dogs_dir)))
print('total test cat images:', len(os.listdir(test_cats_dir)))
print('total test dog images:', len(os.listdir(test_dogs_dir)))


# 训练集:2000
# 验证集:1000
# 测试集：1000
